NLP

A Summary of Contrastive Learning

总结最新的一些对比学习的论文和资源。

A Simple Framework for Contrastive Learning of Visual Representations

模型方法

image

这篇文章提出了SimCLR,使用对比学习,无监督训练图像表示。其方法如下:

  • 使用不同的数据增强操作(如裁剪、去除着色等)对每一个原始样本,生成两张增强后的图像;
  • 使用一个编码器(论文使用的是ResNet-50),获取图像特征向量h
  • 用一个非线性映射(论文使用的是双层全连接,中间用ReLU激活),将图像特征向量h映射到z
  • 对每一个batch计算损失,损失函数如下图:
    image

这里的损失函数相当于要让模型识别出同一个batch内每一个样本的counterparts,而同一个batch内的其他样本可以视为是负样本(称为in-batch negative sample)

整体的算法如下:
image

这里使用的图像增强方法如下:
image

实验

实验发现不同的增强方式组合对效果影响极明显:
image
并且单一的增强方式很难好过组合增强方法。

另外,实验证明,当训练epoch数较少时,越大的batch-size能获得较好的效果;但随着训练epoch数增大,batch-size的影响趋于变小。作者认为,越大的batch-size意味着能获得更多的in-batch negative examples,从而促进模型收敛。

参考

Unsupervised Feature Learning via Non-Parametric Instance Discrimination

方法模型

image

这篇文章应该是第一个提出了Memory Bank的思想。其主要思想为:把同一个batch中的每张图片认为是一个单独的类别,然后模型的要求是识别出自己所属的类别:
image

这里的v是图片的编码表示,w为每个类别的weight vector。传统分类任务,w属于模型参数的一部分,但按照对比学习的思想,这里的w可以替换为其他图片的表示向量,如下:
image

训练目标就是让模型识别出自己:
image

为了计算(2)式,就需要穷举所有图片的表示,为了避免暴力计算,这里作者提出了Memory Bank的结构:Memory Bank中储存了所有图片的表示,他们初始化为随机的128维单位向量。在训练迭代的过程中,每当通过第i张图片的图片表示更新网络参数时,对应Memory Bank中的entry都会进行更新。(感觉类似缓存)

由于类别标签数目会很多,最后还使用了NCE loss(https://www.zhihu.com/question/50043438)将多分类问题转换为二分类问题,从memory bank中采样负样本表示。

最后预测分类时采用KNN的方法来做。

参考

Momentum Contrast for Unsupervised Visual Representation Learning

问题定义

这篇文章可以认为是follow上面的那个Memory Bank的思想的论文。作者对这类用对比学习的思想无监督训练图片表示的工作进行了一个总结,认为它们都是在高维连续空间(例如图片所构成的高维空间)中动态构建离散词典的一种方法。这个词典中的keys(tokens)从数据中采样,并通过一个编码器来表示。无监督学习的目标是使得编码器可以起到一种类似字典查询的效果:编码后的query向量应该和其中的正确的key尽可能相近,并且和其他的尽可能远离。

基于此作者将问题定义如下:
image

作者认为,为了达到好的预训练效果,这个字典在构建的过程中应该满足两个条件:

  1. 足够大,这样才能充分地从高维、连续的空间中采样
  2. 在模型训练过程中具有一致性,即dictionary中的各个entry应该采用相同或相似的编码器去编码,这样才有比较的意义。

基于以上想法,作者提出了自己的动量对比学习方法(MoCo)

MoCo

image

上图对比了一些此前的工作和本文提出的MoCo的区别。

为了达到上述两个条件,作者对传统对比学习方法进行了一些修改:

  1. 将dictionary构建为一个队列,新的mini-batch入队,最旧的mini-batch被替换,这样做使得dictionary的size和mini-batch的size解耦,使得dictionary的size可以比batch size大很多。
  2. 由于使用了队列来扩充dictionary的大小,但这样使得key encoder的梯度回传变得困难(需要回传到每一个key样本)。一种简单的方法就是忽略key部分的梯度,每次的key encoder直接使用query encoder的参数,但实验表现不好。本文提出了一种基于动量的参数更新方法,使得每次保留m(0~1之间)的原来参数和(1-m)的新参数。使用基于动量的更新方式,使得key encoder的参数更新更加平滑,从而使得dictionary中的样本具有一致性。
    image

也就是说在训练的每一步,首先忽略通过key回传的梯度。然后改为通过上式,基于query encoder的新参数去更新key encoder的参数。

最后具体的训练流程如下:
image

在其他方面,例如自监督任务的构建上,由于不是本文重点,因此还是follow其他相关工作,对同一样本采用不同的数据增强方法,并将其作为positive pairs。

Reference:

  1. Slides from Tianyu Gao
  2. A Simple Framework for Contrastive Learning of Visual Representations
  3. Momentum Contrast for Unsupervised Visual Representation Learning
  4. Learning Representations by Maximizing Mutual Information Across Views
  5. A Mutual Information Maximization Perspective of Language Representation Learning